#include "Acceptor.hpp"

namespace ln{

Acceptor::Acceptor(unsigned short port,const string & ip)
:_addr(port,ip)
,_listensock()
{

}

void Acceptor::ready(){
    setReuseAddr(true);
    setReusePort(true);
    bind();
    listen();
}
   
int Acceptor::accept(){
    int netfd = ::accept(fd(),nullptr,nullptr);
    if(netfd < 0){
        perror("accept");
    }
    return netfd;
}

void Acceptor::setReuseAddr(bool on){
    int one = on;
    int ret = setsockopt(fd(),SOL_SOCKET,SO_REUSEADDR,&one,sizeof(one));
    if(ret < 0){
        perror("setsockopt");
    }
}
    
void Acceptor::setReusePort(bool on){
    int one = on;
    int ret = setsockopt(fd(),SOL_SOCKET,SO_REUSEPORT,&one,sizeof(one));
    if(ret < 0){
        perror("setsockopt");
    }

}
    
void Acceptor::bind(){
    int ret = ::bind(fd(),(struct sockaddr *)_addr.getInetAddressPtr(),
                     sizeof(_addr));
    if(ret < 0){
        perror("bind");
    }
}
    
void Acceptor::listen(){
    int ret = ::listen(fd(),20000);
    if(ret < 0){
        perror("listen");
    }
}

}//end of namespace ln
